package com.yeskery.nut.extend.jdbc;

import java.util.List;

/**
 * Sql链操作接口
 * @author sprout
 * 2025-10-10 15:24
 */
public interface SqlChainOperate extends CompletedSqlChainOperate  {

    /** 与 */
    String AND = "AND";

    /** 或 */
    String OR = "OR";

    /** 与SQL链 */
    SqlChain AND_SQL_CHAIN = () -> AND;

    /** 或SQL链 */
    SqlChain OR_SQL_CHAIN = () -> OR;

    /**
     * 添加SQL片段
     * @param sqlChain SQL片段
     * @param chains SQL链
     * @return SqlChainOperate Sql链操作接口
     */
    default SqlChainOperate append(SqlChain sqlChain, List<SqlChain> chains) {
        chains.add(sqlChain);
        return this;
    }

    /**
     * 添加SQL片段
     * @param append SQL片段
     * @param chains SQL链
     * @return SqlChainOperate Sql链操作接口
     */
    default SqlChainOperate append(String append, List<SqlChain> chains) {
        return append(() -> append, chains);
    }

    /**
     * 添加AND
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate and();

    /**
     * 添加OR
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate or();

    /**
     * 添加左括号
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate leftBracket();

    /**
     * 添加右括号
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate rightBracket();

    /**
     * 添加等于
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate eq(String column, Object value);

    /**
     * 添加不等于
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate neq(String column, Object value);

    /**
     * 添加大于
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate gt(String column, Object value);

    /**
     * 添加大于等于
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate gte(String column, Object value);

    /**
     * 添加小于
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate lt(String column, Object value);

    /**
     * 添加小于等于
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate lte(String column, Object value);

    /**
     * 添加like
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate like(String column, Object value);

    /**
     * 添加not like
     * @param column 列名
     * @param value 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate notLike(String column, Object value);

    /**
     * 添加in
     * @param column 列名
     * @param values 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate in(String column, Object... values);

    /**
     * 添加not in
     * @param column 列名
     * @param values 值
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate notIn(String column, Object... values);

    /**
     * 添加between
     * @param column 列名
     * @param value1 值1
     * @param value2 值2
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate between(String column, Object value1, Object value2);

    /**
     * 添加not between
     * @param column 列名
     * @param value1 值1
     * @param value2 值2
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate notBetween(String column, Object value1, Object value2);

    /**
     * 添加is null
     * @param column 列名
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate isNull(String column);

    /**
     * 添加is not null
     * @param column 列名
     * @return SqlChainOperate Sql链操作接口
     */
    SqlChainOperate isNotNull(String column);
}
